package activities;

import java.io.IOException;
import java.net.SocketTimeoutException;
import java.util.ArrayList;
import java.util.List;

import persistencia.BaseDatos;
import webService.AccesoWebService;

import com.androidmodule.onthego.R;
import com.facebook.Session;
import com.facebook.SessionState;
import com.facebook.UiLifecycleHelper;
import com.facebook.model.GraphObject;
import com.facebook.model.OpenGraphAction;
import com.facebook.model.OpenGraphObject;
import com.facebook.widget.FacebookDialog;

import entidades.PromocionHot;
import entidades.Reserva;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.CountDownTimer;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageButton;
import android.widget.TextView;
import android.widget.Toast;

public class ActivityReservaParticular extends Activity{
	PromocionHot promoSeleccionada;
	private TextView textoTemporizador,textoDescuento;
	Reserva reserva;
	CountDownTimer temporizadorTolerancia;
	ImageButton btnFacebook; 
	int numeroDeOrden;
	int descInicial;
	String idPromocion;
	BaseDatos baseDatos;
	int aumento;
	String sCodigoReserva;

	/**
	 * se guarda como global, para que el temporizador la vaya restando
	 * y ais cuando la pantalla se destruye por interrupcion forzada
	 * volver a lanzar el temporizador de donde quedo
	 */
	long tiempoTolerancia;
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.layout_reserva_particular);
        uiHelper = new UiLifecycleHelper(this, callback);
        uiHelper.onCreate(savedInstanceState);
		baseDatos = new BaseDatos(getApplicationContext());
		idPromocion = getIntent().getExtras().getString("idPromocion");
	    textoDescuento = (TextView) findViewById(R.id.etiqueta_descuentoCantidad);
		TextView codigoReserva = (TextView) findViewById(R.id.etiqueta_codigoReserva);
		TextView comercio = (TextView) findViewById(R.id.etiqueta_comercioPromocion);
		TextView hayAumento = (TextView) findViewById(R.id.etiqueta_aumento_porPublicar);
		textoTemporizador = (TextView) findViewById(R.id.etiqueta_cronometroTolerancia);
		btnFacebook = (ImageButton) findViewById(R.id.btn_Send_Facebook);
		sCodigoReserva = getIntent().getExtras().getString("codigoReserva");
		reserva = baseDatos.getReserva(sCodigoReserva);
		if(reserva.getDifDescuentos()>0){
			hayAumento.setText(getString(R.string.con_aumento_promocion));
		}
		else{
			hayAumento.setText(getString(R.string.sin_aumento_promocion));
		}
		if(reserva.getOnFacebook()==Reserva.ON_REDSOCIAL_TRUE){
			btnFacebook.setEnabled(false);
		}
        textoDescuento.setText(reserva.getDescuento()+"%");
		btnFacebook.setOnClickListener(new OnClickListener(){

			@Override
			public void onClick(View arg0) {
				
				if (FacebookDialog.canPresentShareDialog(getApplicationContext(), 
                        FacebookDialog.ShareDialogFeature.SHARE_DIALOG)){
					
				    publicarHistoria("hOLA");
				}
				else{
					Toast.makeText(getApplicationContext(),
							"Debe tener la aplicacion de facebook instalada", Toast.LENGTH_LONG).show();
				}
				
				
			}});
		

		if(savedInstanceState==null){
			tiempoTolerancia=baseDatos.buscarTiempoRestante(idPromocion);
			temporizadorTolerancia =temporizador(tiempoTolerancia).start();
		}
		else{
			tiempoTolerancia = savedInstanceState.getLong("tiempoRestante");
			temporizadorTolerancia = temporizador(tiempoTolerancia).start();
		}
		codigoReserva.setText(reserva.getCodigo());
		comercio.setText(reserva.getComercio());
	}
	   public void onActivityResult(int requestCode, int resultCode, Intent data) {
	        super.onActivityResult(requestCode, resultCode, data);
	        uiHelper.onActivityResult(requestCode, resultCode, data, new FacebookDialog.Callback() {
	            @Override
	            public void onError(FacebookDialog.PendingCall pendingCall, Exception error, Bundle data) {
	                Log.e("Activity", String.format("Error: %s", error.toString()));
	                error.printStackTrace();
	            }

	            @Override
	            public void onComplete(FacebookDialog.PendingCall pendingCall, Bundle data) {
	                Log.i("Activity", "Success!");
	                notificarPublicacionAServidor(getApplicationContext());
	            }
	        });
	    }
	
	public void onSaveInstanceState(Bundle savedInstanceState) {
	    super.onSaveInstanceState(savedInstanceState);
	    uiHelper.onSaveInstanceState(savedInstanceState);
		temporizadorTolerancia.cancel();
		savedInstanceState.putLong("tiempoRestante", tiempoTolerancia);	
	    
	}
	
	public void onPause(){
		super.onPause();
		uiHelper.onPause();
		temporizadorTolerancia.cancel();
	}
	public void onResume(){
		super.onResume();
		uiHelper.onResume();
		tiempoTolerancia=baseDatos.buscarTiempoRestante(idPromocion);
		temporizadorTolerancia =temporizador(tiempoTolerancia).start();
		
	}
	public void onDestroy(){
		super.onDestroy();
		uiHelper.onDestroy();
	}

	/* metodo para crear un temporizador, tiene como parametro el tiempo
	 * que restante para hacer la accion
	 */
	
	public CountDownTimer temporizador (long tiempoRestante){
		return new CountDownTimer(tiempoRestante, 1000) {

		     public void onTick(long millisUntilFinished) {
		    	 tiempoTolerancia= millisUntilFinished;
		    	 textoTemporizador.setText(convertirTiempoAString(millisUntilFinished));  	
		     }

		     public void onFinish() {
		    	textoTemporizador.setText(getString(R.string.etiqueta_tolerancia_acabada));
		     }
		  };
	}
	
	 /**
     * Este metodo devuele un vector de enteros con las horas, minutos
     * y segundos restantes. El metodo se basa en el principio de que las promociones
     * duran menos de un dia sino falla
     * @return
     */
    public int[] tiempoCronometro(long tiempoRestante){
    	int[] tiempo = new int [3];
    	long diffHoras = tiempoRestante / (60 * 60 * 1000);
    	tiempoRestante=tiempoRestante-(diffHoras*(60 * 60 * 1000));
    	long diffMinutes = tiempoRestante / (60 * 1000);
        tiempoRestante=tiempoRestante-(diffMinutes*(60 * 1000));
        long diffSeconds = tiempoRestante/ 1000;
        
        tiempo[0]=(int) diffHoras;
        tiempo[1]=(int) diffMinutes;
        tiempo[2]=(int) diffSeconds;
        
        return tiempo;
    }
    
    /**
     * Este metodo toma el vector de horas minutos y segundos
     * y lo transforma a string par amostrar el cronometro
     * @return
     */
    public String convertirTiempoAString(long tiempoRestante){
    	int[] tiempo = tiempoCronometro(tiempoRestante);
    	return ""+tiempo[0]+":"+tiempo[1]+":"+tiempo[2];
    }
    
    /*****************************************FACEBOOK*********************************************/
	private UiLifecycleHelper uiHelper;
	static final String TAG = "FACEBOOK";
	private void onSessionStateChange(Session session, SessionState state, Exception exception) {
	    if (state.isOpened()) {
	        Log.i(TAG, "Logged in...");
	    } else if (state.isClosed()) {
	        Log.i(TAG, "Logged out...");
	    }
	}
	
	private Session.StatusCallback callback = new Session.StatusCallback() {
	    @Override
	    public void call(Session session, SessionState state, Exception exception) {
	        onSessionStateChange(session, state, exception);
	    }
	};
	
	private void publicarHistoria(String titulo){
	 
		OpenGraphObject promocion = OpenGraphObject.Factory.createForPost("OnTheGo");
		promocion.setProperty("title", titulo);
		promocion.setProperty("description", "Gracias a OnTheGo accedi a esta fantastica promocion!");
		
        /**
		Bitmap imagen = BitmapFactory.decodeResource(getResources(), R.drawable.shopping);
		List<Bitmap> images = new ArrayList<Bitmap>();
		images.add(imagen);
		*/

		OpenGraphAction action = GraphObject.Factory.create(OpenGraphAction.class);
		action.setProperty("route", promocion);

		FacebookDialog shareDialog = new FacebookDialog.OpenGraphActionDialogBuilder(this, action, "fbsdktoolkit:climb", "route")
		  //  .setImageAttachmentsForObject("route", images, true)
		    .build();
		uiHelper.trackPendingDialogCall(shareDialog.present());
		
		
	}

	/**************************************************************************************************/
    /**
     * Metodo que restablece el cronometro frente a cambis dle cronometro
     */
    public void notificarPublicacionAServidor(final Context contexto){
    	new AsyncTask<Void, Integer, String>() {
            int codigoError= AccesoWebService.NO_ERROR;

                @Override
                protected String doInBackground(Void... params) { 
                	 String resultado = "";
                	 AccesoWebService webService = new AccesoWebService();
                     try {
                         resultado=webService.notificarPublicacionRedSocial(sCodigoReserva, (int)reserva.getDifDescuentos()/2);
                     }
                     catch(SocketTimeoutException time){
                    	 codigoError=AccesoWebService.TIMEOUT_ERROR;
                     }
                     catch (IOException ex) {
                         throw new RuntimeException();
                     
                     }
                     return resultado;
                }

                protected void onProgressUpdate(Integer... values){}

                protected void onPostExecute(String mensaje){
                	if(codigoError==AccesoWebService.NO_ERROR){
                		if("CORRECTO".equalsIgnoreCase(mensaje)){
                			int descuentoBase = reserva.getDescuento();
                			reserva.setDescuento((descuentoBase+reserva.getDifDescuentos()/2));
                			reserva.setOnFacebook(Reserva.ON_REDSOCIAL_TRUE);
                			baseDatos.actualizarReserva(sCodigoReserva, reserva);
                			textoDescuento.setText(reserva.getDescuento()+"%");
                			btnFacebook.setEnabled(false);
                		}
                		
                		
                	}
                	else{
                          if(codigoError==AccesoWebService.TIMEOUT_ERROR){
                        	  Toast.makeText(getApplicationContext(), "No se puede Acceder al servidor", Toast.LENGTH_LONG).show();
                        	  
                          }
                	}
                	
                }
        }.execute();
    }
}
